Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - [VB6] Come richiamare le funzioni di una DLL
Forum - Visual Basic 6 - [VB6] Come richiamare le funzioni di una DLL

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
beniaminos (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 21:59
Martedì, 02/02/2010
Salve a tutti,
data una DLL con queste definizioni:
// Defines the entry point for the console application.
.
.
extern "C" {
__declspec(dllexport) void *initDecomp() {
    return new XDecompressor();
}
__declspec(dllexport) size_t decompressQ(XDecompressor *decomp, unsigned char *buf, size_t size, unsigned char *ret, size_t retsize) {
    decomp->decompress(ret, &retsize, buf, &size);
    return retsize;
}
.
.

..come faccio a richiamare queste funzioni da VB6?
Grazie a tutti.

Beniamino.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:17
Martedì, 02/02/2010
Cosa fa la DLL in C++ ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
beniaminos (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 22:28
Martedì, 02/02/2010
La dll comprime/decomprime Dati.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:33
Martedì, 02/02/2010
Beh ... proviamo con la prima ... dichiara la funzione con

Codice sorgente - presumibilmente VB.NET

  1. Public Declare Function initDecomp Lib "tuadll.dll" () As Long



avendo cura di indicare il percorso completo della dll e il suo nome e di chiamare la funzione con

Codice sorgente - presumibilmente Visual Basic 6

  1. Dim obj as Long
  2. obj = initDecomp()
  3. Print Hex(obj)




Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
beniaminos (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 22:50
Martedì, 02/02/2010
...perfetto...

ho provato con il codice:
  
  Dim AA As Long
  AA = initDecomp

Risultato:

  aa=86322040

che dovrebbe essere l'handle dell'oggetto inizializzato da usare per richiamare la funzione "decompressQ", passandolo come primo argomento.....credo...
Grazie

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:53
Martedì, 02/02/2010
Testo quotato

Postato originariamente da beniaminos:

...perfetto...

...

che dovrebbe essere l'handle dell'oggetto inizializzato da usare per richiamare la funzione "decompressQ", passandolo come primo argomento.....credo...



Sì ... ma non è un handle, bensì un puntatore in memoria ...

Per la seconda, bisognerebbe conoscere lo scopo di tutti i parametri (soprattutto se sono di input, output o I/O) e se è necessario allocare memoria per i parametri passati come puntatori (come buf e ret) o se l'allocazione è interna alla funzione ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
beniaminos (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 23:00
Martedì, 02/02/2010
forse questa parte di codice della dll può aiutarti ad aiutarmi:

#include "Incs.h"
#include "stdio.h"

XDecompressor::XDecompressor() {
  nBits = 0;
  bits = 0;
}

XDecompressor::~XDecompressor() { }

inline int XDecompressor::_get( const BYTE*& src, const BYTE* srcEnd, int n )
{
  assert( n <= 8 );
  if ( nBits < n ) {
    if ( src >= srcEnd ) {
      nBits = 0;
      return -1;
    }

    bits |= ( *src++ << ( 24 - nBits ) );
    nBits += 8;
  }

  int ret = bits >> ( 32 - n );
  bits <<= n;
  nBits -= n;
  return ret;
}

BOOL XDecompressor::decompress( BYTE* dst, size_t* dstSz, const BYTE* src, size_t* srcSz )
{
  BYTE* startDst = dst;
  const BYTE* startSrc = src;
  const BYTE* endSrc = src + *srcSz;
  const BYTE* endDst = dst + *dstSz;
  nBits = 0;

  for (;;) {
    int grp = _get( src, endSrc, 4 );
    if ( grp < 0 ) {
      return FALSE;
    }

    Group& group = groupTable[ grp ];

    int symbol;
    int nBits = group.nBits;

    if ( nBits == 0 ) {
      symbol = symbolTable[ group.pos ];
    } else {
      assert( nBits <= 8 );
      int got = _get( src, endSrc, nBits );

      if ( got < 0 ) {
        return FALSE;
      }

      int pos = group.pos + got;

      if ( pos >= NHUFFSYMBOLS ) {
        return FALSE;
      }

      symbol = symbolTable[ pos ];
    }

    assert( symbol < NHUFFSYMBOLS );
    ++stat[ symbol ];

    int matchOver;
    BOOL shift = FALSE;

    if ( symbol < 256 ) {
      if ( dst >= endDst ) {
        return FALSE;
      }

      *dst++ = (BYTE)symbol;
      _toBuf( symbol );
      continue; //forever

    } else if ( symbol == NHUFFSYMBOLS - 2 ) {
      HuffStatTmpStruct s[ NHUFFSYMBOLS ];
      makeSortedTmp( s );

      for ( int i=0; i < NHUFFSYMBOLS ; ++i )
        symbolTable[ i ] = s[ i ].i;

      int lastNBits = 0;
      int pos = 0;

      for ( i=0; i < 16 ; ++i ) {

        for ( int n=0 ;; ++n )
          if ( _get( src, endSrc, 1 ) )
            break;

        lastNBits += n;
        groupTable[ i ].nBits = lastNBits;
        groupTable[ i ].pos   = pos;

        pos += 1 << lastNBits;
      }

      assert( pos < NHUFFSYMBOLS + 255 );
      continue;  //forever


    } else if ( symbol == NHUFFSYMBOLS - 1 )
       break;    //forever

    static struct MatchOverItem {
      int nExtraBits;
      int base;
    } _matchOverTable[] = {
      { 1,   8 },
      { 2,  10 },
      { 3,  14 },
      { 4,  22 },
      { 5,  38 },
      { 6,  70 },
      { 7, 134 },
      { 8, 262 }
    };

    if ( symbol < 256 + 8 ) {
      matchOver = symbol - 256;
    } else {
      MatchOverItem* item = &_matchOverTable[ symbol - 256 - 8 ];
      int extra = _get( src, endSrc, item->nExtraBits );

      if ( extra < 0 ) {
        return FALSE;
      }

      matchOver = item->base + extra;
    }

    int dispPrefix = _get( src, endSrc, 3 );

    if ( dispPrefix < 0 ) {
      return FALSE;
    }

    static struct DispItem {
       int nBits;
       int disp;
    } _dispTable[] = {
       { 0,  0 },
       { 0,  1 },
       { 1,  2 },
       { 2,  4 },
       { 3,  8 },
       { 4, 16 },
       { 5, 32 },
       { 6, 64 }
    };

    DispItem* item = &_dispTable[ dispPrefix ];
    nBits = item->nBits + LZBUFBITS - 7;

    int disp = 0;
    assert( nBits <= 16 );

    if ( nBits > 8 ) {
      nBits -= 8;
      disp |= _get( src, endSrc, 8 ) << nBits;
    }

    assert( nBits <= 8 );
    int got = _get( src, endSrc, nBits );

    if ( got < 0 ) {
      return FALSE;
    }

    disp |= got;
    disp += item->disp << (LZBUFBITS - 7);
    assert( disp >=0 && disp < LZBUFSIZE );

    int matchLen = matchOver + LZMIN;

    if ( dst + matchLen > endDst ) {
      return FALSE;
    }

    int pos = bufPos - disp;
    if ( matchLen < disp ) {
      _bufCpy( dst, pos, matchLen );
    } else {
      _bufCpy( dst, pos, disp );

      for ( int i=0; i < matchLen - disp; ++i ) {
         dst[ i + disp ] = dst[ i ];
      }
    }

    _toBuf( dst, matchLen );
    dst += matchLen;

  } // forever

  if ( dstSz )
    *dstSz = dst - startDst;

  if ( srcSz )
    *srcSz = src - startSrc;

  return TRUE;
}

#endif

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:14
Martedì, 02/02/2010
Nel codice si lavora nei buffer (in entrata e in uscita) attraverso i puntatori senza allocarli. Quindi, prevede che siano allocati prima di chiamiare la funzione (dal codice chiamante).

Quindi, i dati da decomprimere li avrai a disposizione in un vettore di byte e un altro vettore di byte sarà pronto (ovvero con lo spazio già allocato) per avere il risultato in output.

Ma i dati da decomprimere, tu dove li hai?


P.S. Comunque, mi sa che la classe XDecompressor non serva a molto (non fa quasi nulla nel costruttore, addirittura nulla nel distruttore), quindi non la userei e, al suo posto, utilizzerei direttamente il metodo decompress (come semplice funzione, eliminando così la initDecomp).


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
beniaminos (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/02/2010

Segnala al moderatore
Postato alle 23:24
Martedì, 02/02/2010
...quel che mi interessa è riuscire ad utilizzare la dll per decomprimere dei dati.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo